/*
 * Copyright (C) 2018 The Asiainfo-Ability Authors
 *
 *      Licensed under the Apache License, Version 2.0 (the "License");
 *      you may not use this file except in compliance with the License.
 *      You may obtain a copy of the License at
 *
 *          http://www.apache.org/licenses/LICENSE-2.0
 *
 *      Unless required by applicable law or agreed to in writing, software
 *      distributed under the License is distributed on an "AS IS" BASIS,
 *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *      See the License for the specific language governing permissions and
 *      limitations under the License.
 */

package org.asiainfo.ability.gateway.custom;

import com.netflix.client.config.IClientConfig;
import com.netflix.zuul.context.RequestContext;
import org.asiainfo.ability.base.vo.Record;
import org.asiainfo.ability.gateway.context.AbilityRequestContext;
import org.springframework.cloud.netflix.ribbon.apache.RibbonApacheHttpRequest;
import org.springframework.cloud.netflix.ribbon.apache.RibbonLoadBalancingHttpClient;
import org.springframework.cloud.netflix.zuul.filters.ZuulProperties;
import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
import org.springframework.cloud.netflix.zuul.filters.route.RibbonCommandContext;
import org.springframework.cloud.netflix.zuul.filters.route.apache.HttpClientRibbonCommand;

/**
 *   Customize the HttpClientRibbonCommand for dynamic setting ribbbon timeout
 *
 * @Author: visen
 * @Date: 2018/1/16
 * @Description:
 *
 */
@SuppressWarnings("unchecked")
public class CustomHttpClientRibbonCommand extends HttpClientRibbonCommand {
    public CustomHttpClientRibbonCommand(final String commandKey,
                                   final RibbonLoadBalancingHttpClient client,
                                   final RibbonCommandContext context,
                                   final ZuulProperties zuulProperties) {
        super(commandKey, client, context, zuulProperties);
    }


    public CustomHttpClientRibbonCommand(final String commandKey,
                                   final RibbonLoadBalancingHttpClient client,
                                   final RibbonCommandContext context,
                                   final ZuulProperties zuulProperties,
                                   final FallbackProvider zuulFallbackProvider) {
        super(commandKey, client, context, zuulProperties, zuulFallbackProvider);
    }

    public CustomHttpClientRibbonCommand(final String commandKey,
                                   final RibbonLoadBalancingHttpClient client,
                                   final RibbonCommandContext context,
                                   final ZuulProperties zuulProperties,
                                   final FallbackProvider zuulFallbackProvider,
                                   final IClientConfig config) {
        super(commandKey, client, context, zuulProperties, zuulFallbackProvider, config);
    }

    @Override
    protected RibbonApacheHttpRequest createRequest() throws Exception {
        RibbonApacheHttpRequest ribbonApacheHttpRequest = new CustomRibbonApacheHttpRequest(this.context);
        AbilityRequestContext requestContext = (AbilityRequestContext) RequestContext.getCurrentContext()
                .get(AbilityRequestContext.CONTEXT_KEY);
        //Record record = requestContext.getRecord();
        //System.out.println(System.currentTimeMillis() - record.getBeginTime());
        return ribbonApacheHttpRequest;
    }


}
